'use strict'

let
    // 引入 初始化数据库 信息 
    {Sequelize,DataTypes,database,username,password,host,dialect} = require('./config');

// 实例化数据库(连接数据库) 1.database 2.username 3.password 4.{1.地址 2.数据库}
let sequelize = new Sequelize(database,username,password, {
    host: host,
    dialect: dialect
});


// 定义统一的属性
function defineMoel(modelName, attributs) {

    let prop = {}

    prop.id = {
        type: DataTypes.BIGINT,
        primaryKey: true,
        autoIncrement: true
    }
    // 循环 我们传入的对象 添加到 prop 对象中
    for (let key in attributs) {
        prop[key] = attributs[key]
    }

    prop.createAt = {
        type: DataTypes.STRING(80),
        allowNull: false
    }
    prop.updateAt = {
        type: DataTypes.STRING(80),
        allowNull: false
    }
    prop.version = {
        type: DataTypes.STRING(80),
        allowNull: false,
        defaultValue: '0'
    }
    prop.remarks = {
        type: DataTypes.STRING(800),
        allowNull: true
    }

    // 添加 模型 
    let model = sequelize.define(modelName, prop, {
        tableName:modelName,
        timestamps:false,
        // 定义一个钩子 用于插入数据前验证数据信息
        hooks: {
            // 插入数据前验证  Validate(验证)
            // 如果插入的数据是新的 那么 创建时间于更新时等于当前插入时间 版本号为 1； 如果插入的数据是旧 那么 更新时间等于现在时间 版本 +1
            beforeValidate: function (obj) {
                // 获取当前时间戳
                let now = Date.now();
                // 判断是否是新的记录
                if (obj.isNewRecord) {
                    obj.createAt = now,
                        obj.updateAt = now,
                        obj.version = 1;
                } else {
                    obj.updateAt = now,
                        obj.version += 1;
                }
            }
        }
    });

    return model
};


// 定义成 对象暴露 方便 直接使用值 
let obj = {
    sequelize,
    DataTypes,
    defineMoel
};

// 暴露 obj
module.exports = obj ;